home *** CD-ROM | disk | FTP | other *** search
- /*
- MOD 07-12-87 MAZ - byte i/o routines, generalized a little bit for converter
- */
- #include <FileMgr.h>
- #include "MAZlib.h"
-
- /* for putbytes/getbytes */
- long buffersize = 0L;
- unsigned char *rblock = null;
- unsigned char *rbptr;
- long bbleft;
- long fbleft;
- long bufpos;
-
- /* init for I/O - allocates buffer */
- bool init_io(pad)
- long pad;
- {
- unsigned char *padding;
-
- if (buffersize <= 0L)
- {
- /* free any old buffer */
- if (rblock != null)
- {
- DisposPtr(rblock);
- rblock = null;
- }
- /* do padding */
- padding = null;
- if (pad > 0L)
- {
- padding = (unsigned char *)NewPtr(pad);
- if (padding == null)
- return(false);
- }
- /* pad < 0 means use -pad as buffersize */
- if (pad < 0L)
- buffersize = -pad;
- else
- buffersize = 0x10000L;
- /* loop trying smaller sizes until we allocate a buffer */
- while (buffersize >= 0L)
- {
- /* try the allocate at this size */
- rblock = (unsigned char *)NewPtr(buffersize);
- if (rblock != null)
- break;
- /* failure: reduce size of buffer and try again */
- buffersize -= 0x400L;
- }
- /* free any padding */
- if (padding != null)
- DisposPtr(padding);
- }
- /* return true if we got a buffer */
- return(buffersize > 0L);
- }
-
- /* terminate I/O */
- term_io()
- {
- if (rblock != null)
- {
- DisposPtr(rblock);
- rblock = null;
- buffersize = 0L;
- }
- }
-
- /* initialize for putbytes disk output */
- init_write(io)
- ioParam *io;
- {
- /* position to start of output, init an empty buffer */
- rbptr = rblock;
- bbleft = buffersize;
- io->ioPosMode = fsFromStart;
- io->ioPosOffset = 0L;
- }
-
- /* flush the output buffer */
- flushbytes(io)
- ioParam *io;
- {
- if (rbptr == rblock)
- return;
- io->ioReqCount = rbptr - rblock;
- io->ioBuffer = (char *)rblock;
- PBWrite(io, false);
- rbptr = rblock;
- bbleft = buffersize;
- }
-
- /* read initial buffer for getbytes */
- long init_read(io, pos)
- ioParam *io;
- long pos;
- {
- long filebytes;
-
- /* get the end of file position for file */
- io->ioMisc = 0;
- PBGetEOF(io, false);
- filebytes = (long)io->ioMisc;
- /* load the initial buffer from file */
- io->ioReqCount = buffersize;
- io->ioBuffer = (char *)rblock;
- io->ioPosMode = fsFromStart;
- io->ioPosOffset = bufpos = pos;
- PBRead(io, false);
- /* setup I/O variables */
- rbptr = rblock;
- bbleft = io->ioActCount;
- fbleft = filebytes - pos;
- /* return total size of file */
- return(filebytes);
- }
-
- /* position the input file */
- pos_read(io, pos)
- ioParam *io;
- register long pos;
- {
- register long count;
-
- /* back up to start of this buffer */
- count = rbptr - rblock;
- fbleft += count;
- bbleft += count;
- rbptr = rblock;
- /* see if this pos is within the current buffer */
- if (pos < bufpos || pos >= bufpos + bbleft)
- init_read(pos); /* no, read in a new buffer */
- else
- {
- /* position buffer to right place */
- count = pos - bufpos;
- fbleft -= count;
- bbleft -= count;
- rbptr += count;
- }
- }
-
- /* read bytes from the input file */
- short getbytes(io, buffer, count)
- ioParam *io;
- register unsigned char *buffer;
- register long count;
- {
- /* check for eof easy way */
- if (fbleft <= 0L)
- return(1); /* my eof */
- /* read any whole buffer-fulls needed */
- while (bbleft <= count)
- {
- /* copy rest of current buffer (if any) */
- if (bbleft > 0L)
- {
- fbleft -= bbleft;
- count -= bbleft;
- longcpybuf(buffer, rbptr, bbleft);
- buffer += bbleft;
- }
- /* read in the next buffer */
- bufpos = io->ioPosOffset;
- io->ioReqCount = buffersize;
- io->ioBuffer = (char *)rblock;
- PBRead(io, false);
- /* reset pointers */
- rbptr = rblock;
- bbleft = io->ioActCount;
- if (bbleft <= 0L)
- return(1); /* eof */
- }
- /* transfer what's left */
- if (count > 0)
- {
- longcpybuf(buffer, rbptr, count);
- fbleft -= count;
- bbleft -= count;
- rbptr += count;
- }
- return(0);
- }
-
- /* write bytes to the output file */
- putbytes(io, buffer,count)
- ioParam *io;
- register unsigned char *buffer;
- register long count;
- {
- /* write any whole buffer-fulls needed */
- while (bbleft <= count)
- {
- count -= bbleft;
- longcpybuf(rbptr, buffer, bbleft);
- buffer += bbleft;
- io->ioPosMode = fsFromStart;
- io->ioReqCount = buffersize;
- io->ioBuffer = (char *)rblock;
- PBWrite(io, false);
- rbptr = rblock;
- bbleft = buffersize;
- }
- /* write what's left */
- if (count > 0)
- {
- longcpybuf(rbptr, buffer, count);
- bbleft -= count;
- rbptr += count;
- }
- }
-